package cn.zclong.controller;

import java.io.File;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import cn.zclong.pojo.ItemsCustom;
import cn.zclong.pojo.ItemsQueryVo;
import cn.zclong.service.ItemsService;


@Controller
@RequestMapping("/items")
public class ItemsController {

	@Autowired
	private ItemsService itemsService;

	// 商品查询
	@RequestMapping("/queryItems")
	public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception {

		// 调用service查找 数据库，查询商品列表
		List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);

		// 返回ModelAndView
		ModelAndView modelAndView = new ModelAndView();
		// 相当 于request的setAttribut，在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);

		// 指定视图
		// 下边的路径，如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀，修改为
		// modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
		// 上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
		modelAndView.setViewName("items/itemsList");

		return modelAndView;
	}

	/**
	 * 使用RESTful风格
	 * 查询商品信息，输出json
	 * 2017年9月30日
	 * zclong
	 * @param id
	 * @return
	 * @throws Exception
	 * ItemsCustom
	 */
	@RequestMapping("/itemsView/{id}")
	public @ResponseBody ItemsCustom itemsView(@PathVariable("id") Integer id) throws Exception {
		
		//调用service查询商品信息
		ItemsCustom itemsCustom = itemsService.findItemById(id);
		
		return itemsCustom;
	}
	/**
	 * 修改商品信息 2017年9月29日 zclong
	 * 
	 * @return
	 * @throws Exception
	 *             ModelAndView
	 */
	// @RequestMapping("/editItem")
	// 限制http请求方法，可以使get或者post
	/*
	 * @RequestMapping(value="/editItem",method={RequestMethod.POST,
	 * RequestMethod.GET}) public ModelAndView editItems() throws Exception {
	 * 
	 * //调用service根据商品id查询商品信息 ItemsCustom itemsCustom =
	 * itemsService.findItemById(1);
	 * 
	 * //返回ModelAndView ModelAndView modelAndView = new ModelAndView();
	 * 
	 * //将商品信息放到model中 modelAndView.addObject("itemsCustom", itemsCustom);
	 * 
	 * //转发到商品修改页面 modelAndView.setViewName("items/editItems");
	 * 
	 * return modelAndView; }
	 */

	@RequestMapping(value = "/editItem", method = { RequestMethod.POST, RequestMethod.GET })
	public String editItems(Model model, Integer id) throws Exception {

		// 调用service根据商品id查询商品信息
		ItemsCustom itemsCustom = itemsService.findItemById(id);

		// 将商品信息放到model中
		model.addAttribute("itemsCustom", itemsCustom);

		return "items/editItems";
	}

	// 商品信息修改
	// 在需要校验的pojo前边添加@Validated，在需要校验的pojo后边添加BindingResult
	// bindingResult接收校验出错信息
	// 注意：@Validated和BindingResult bindingResult是配对出现，并且形参顺序是固定的（一前一后）。
	@RequestMapping("/editItemsSubmit")
	public String editItemsSubmit(Model model, HttpServletRequest request, Integer id,
			@Validated ItemsCustom itemsCustom, BindingResult bindingResult, MultipartFile items_pic) throws Exception {

		// 获取校验错误信息
		if (bindingResult.hasErrors()) {
			// 输出错误信息
			List<ObjectError> allErrors = bindingResult.getAllErrors();
			for (ObjectError objectError : allErrors) {
				// 输出错误信息
				System.out.println(objectError.getDefaultMessage());
			}
			// 将错误信息返回到前台
			model.addAttribute("allErrors", allErrors);
			return "items/editItems";
		}
		
		/*
		 * 上传文件操作
		 */
		//获取上传文件的原始名称
		String originalFilename = items_pic.getOriginalFilename();
		//上传图片
		if(items_pic != null && originalFilename != null && originalFilename.length()>0) {
			//存储图片的物理路径
			String pic_path = "F:\\java资料\\springmvc\\day02\\文件上传\\";
			//新的图片名称
			String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
			//新图片
			File newFile = new File(pic_path + newFileName);
			
			//将内存中的数据写进磁盘
			items_pic.transferTo(newFile);
			
			//将新图片名称写到itemsCustom中
			itemsCustom.setPic(newFileName);
		}
		
		// 调用service更新商品信息，页面需要将商品信息传到此方法
		// ...
		itemsService.updateItems(id, itemsCustom);
		// 重定向到商品查询列表
		return "redirect:queryItems.action";
		// 转发
		// return "success";
	}

	/**
	 * 批量删除商品信息 2017年9月30日 zclong
	 * 
	 * @param items_id
	 *            : 传过来的是商品信息的id（多个以数组的形式）
	 * @throws Exception
	 *             void
	 */
	@RequestMapping("/deleteItems")
	public String deleteItems(Integer[] items_id) throws Exception {
		// 进行调用业务层操作
		// ....
		System.out.println(items_id);
		return "success";
	}

	// 批量修改商品页面，将商品信息查询出来，在页面中可以编辑商品信息
	@RequestMapping("/editItemsQuery")
	public ModelAndView editItemsQuery(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception {

		// 调用service查找 数据库，查询商品列表
		List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);

		// 返回ModelAndView
		ModelAndView modelAndView = new ModelAndView();
		// 相当 于request的setAttribut，在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);

		// 指定视图
		// 下边的路径，如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀，修改为
		// modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
		// 上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
		modelAndView.setViewName("items/editItemsQuery");

		return modelAndView;
	}

	// 批量修改商品提交
	// 通过ItemsQueryVo接收批量提交的商品信息，将商品信息存储到itemsQueryVo中itemsList属性中。
	@RequestMapping("/editItemsAllSubmit")
	public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception {

		return "success";
	}
}
